﻿using Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation;
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;

namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic {

	/// <summary>
	/// Executa a lógica de negócio de cadastro de tipo de aplicação de corretagem.
	/// </summary>
	public class TipoAplicacaoCorretagem : BaseBusinessLogic {

		#region Atributos 
		private int ERRO_PARAMETRONAOINFORMADO = 109460;
		#endregion Atributos

		#region Construtores 
		public TipoAplicacaoCorretagem(){} 
		#endregion Construtores

		#region Métodos 
		/// <summary>
		/// Altera um tipo de aplicação de corretagem
		/// </summary>
		/// <param name="entity"></param>
		public void AlterarTipoAplicacaoCorretagem(BusinessEntity.TipoAplicacaoCorretagem entity)
        {
            BusinessRuleValidation.CamposObrigatoriosTipoAplicacaoCorretagem validacaoFiltro = new BusinessRuleValidation.CamposObrigatoriosTipoAplicacaoCorretagem();
            validacaoFiltro.EntityToValidate = entity;

            BusinessRuleValidation.ExisteDescricaoTipoAplicacaoCorretagem validacaoExistencia = new BusinessRuleValidation.ExisteDescricaoTipoAplicacaoCorretagem();
            validacaoExistencia.EntityToValidate = entity;

            BusinessRulesValidator validador = new BusinessRulesValidator();
            validador.AddValidation("CamposObrigatoriosTipoAplicacaoCorretagem", validacaoFiltro);
            validador.AddValidation("ExisteDescricaoTipoAplicacaoCorretagem", validacaoExistencia);

            validador.Validate();

            ResourceAccess.TipoAplicacaoCorretagem corretagem = new ResourceAccess.TipoAplicacaoCorretagem();
            corretagem.AlterarTipoAplicacaoCorretagem(entity);

		}

		/// <summary>
		/// Altera um lista de tipos de aplicações de corretagem
		/// </summary>
		/// <param name="entityList"></param>
		public void AlterarTiposAplicacoesCorretagem(List<BusinessEntity.TipoAplicacaoCorretagem> entityList)
        {
            foreach (BusinessEntity.TipoAplicacaoCorretagem corretagem in entityList)
            {
                this.AlterarTipoAplicacaoCorretagem(corretagem);   
            }
		}

		/// <summary>
		/// Busca um lista de tipos de aplicações de corretagem
		/// </summary>
		/// <param name="entity"></param>
		public List<BusinessEntity.TipoAplicacaoCorretagem> ConsultarTiposAplicacoesCorretagem(BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagem entity)
        {
            if (entity == null)
                throw new BusinessException(ERRO_PARAMETRONAOINFORMADO);

            ResourceAccess.TipoAplicacaoCorretagem corretagem = new ResourceAccess.TipoAplicacaoCorretagem();
            return corretagem.ConsultarTiposAplicacoesCorretagem(entity);
		}

		/// <summary>
		/// Exclui um tipo de aplicação de corretagem
		/// </summary>
		/// <param name="entity"></param>
		public void ExcluirTipoAplicacaoCorretagem(BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave entity)
        {
            BusinessRuleValidation.ValidacaoExclusaoTipoAplicacaoCorretagem validacaoFiltro = new BusinessRuleValidation.ValidacaoExclusaoTipoAplicacaoCorretagem();
            validacaoFiltro.EntityToValidate = entity;

            BusinessRulesValidator validador = new BusinessRulesValidator();
            validador.AddValidation("ValidacaoExclusaoTipoAplicacaoCorretagem", validacaoFiltro);
            validador.Validate();

            ResourceAccess.TipoAplicacaoCorretagem corretagem = new ResourceAccess.TipoAplicacaoCorretagem();
            corretagem.ExcluirTipoAplicacaoCorretagem(entity);
		}

		/// <summary>
		/// Exclui uma lista de tipos de aplicações de corretagem
		/// </summary>
		/// <param name="entityList"></param>
		public void ExcluirTiposAplicacoesCorretagem(List<BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave> entityList)
        {
            foreach (BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave corretagem in entityList)
            {
                this.ExcluirTipoAplicacaoCorretagem(corretagem);
            }
		}

		/// <summary>
		/// Executa transacoes de blocos de inclusoes, alteracoes e exclusoes em lote
		/// </summary>
		/// <param name="inclusoes"></param>
		/// <param name="alteracoes"></param>
		/// <param name="exclusoes"></param>
		public void ExecutarTransacoes(List<BusinessEntity.TipoAplicacaoCorretagem> inclusoes, 
            List<BusinessEntity.TipoAplicacaoCorretagem> alteracoes, 
            List<BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave> exclusoes)
        {
            foreach (var item in exclusoes)
            {
                this.ExcluirTipoAplicacaoCorretagem(item);    
            }

            foreach (BusinessEntity.TipoAplicacaoCorretagem item in inclusoes)
            {
                this.IncluirTipoAplicacaoCorretagem(item);
            }

            foreach (BusinessEntity.TipoAplicacaoCorretagem item in alteracoes)
            {
                this.AlterarTipoAplicacaoCorretagem(item);
            }
		}

		/// <summary>
		/// Incluir um novo tipo de aplicação de corretagem
		/// </summary>
		/// <param name="entity"></param>
		public void IncluirTipoAplicacaoCorretagem(BusinessEntity.TipoAplicacaoCorretagem entity)
        {
            if (entity == null)
                throw new BusinessException(ERRO_PARAMETRONAOINFORMADO);

            BusinessRuleValidation.CamposObrigatoriosTipoAplicacaoCorretagem validacaoFiltro = new BusinessRuleValidation.CamposObrigatoriosTipoAplicacaoCorretagem();
            validacaoFiltro.EntityToValidate = entity;

            BusinessRuleValidation.ExisteIdentificadorTipoAplicacaoCorretagem validacaoExistenciaIdentificador = new ExisteIdentificadorTipoAplicacaoCorretagem();
            validacaoExistenciaIdentificador.EntityToValidate = entity;

            BusinessRuleValidation.ExisteDescricaoTipoAplicacaoCorretagem validacaoExistenciaDescricao = new ExisteDescricaoTipoAplicacaoCorretagem();
            validacaoExistenciaDescricao.EntityToValidate = entity;
            
            BusinessRulesValidator validador = new BusinessRulesValidator();
            validador.AddValidation("CamposObrigatoriosTipoAplicacaoCorretagem", validacaoFiltro);
            validador.AddValidation("validacaoExistenciaIdentificador", validacaoExistenciaIdentificador);
            validador.AddValidation("validacaoExistenciaDescricao", validacaoExistenciaDescricao);

            validador.Validate();
            
            ResourceAccess.TipoAplicacaoCorretagem corretagem = new ResourceAccess.TipoAplicacaoCorretagem();
            corretagem.IncluirTipoAplicacaoCorretagem(entity);

		}

		/// <summary>
		/// Inclui uma lista de tipos de aplicações de corretagem
		/// </summary>
		/// <param name="entityList"></param>
		public void IncluirTiposAplicacoesCorretagem(List<BusinessEntity.TipoAplicacaoCorretagem> entityList)
        {
            foreach (BusinessEntity.TipoAplicacaoCorretagem item in entityList)
            {
                this.IncluirTipoAplicacaoCorretagem(item);
            }
		}

		/// <summary>
		/// Obtem um tipo de aplicação de corretagem
		/// </summary>
		/// <param name="entity"></param>
        public BusinessEntity.TipoAplicacaoCorretagem ObterTipoAplicacaoCorretagem(BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave entity)
        {
            SinacorValidation valid = new SinacorValidation();
            valid.Validate<BusinessEntity.Parameter.FiltroTipoAplicacaoCorretagemChave>(entity);
            
            ResourceAccess.TipoAplicacaoCorretagem corretagem = new ResourceAccess.TipoAplicacaoCorretagem();
            return corretagem.ObterTipoAplicacaoCorretagem(entity);
		} 

		#endregion Métodos 

	}

}